﻿//表单
//提供客户端取值，客户端验证的表单类
Function.registerNameSpace("Page");

Page.Form=function(objid){
    Function.registerClass(this);
    this.form=$$(objid);
    var form_submit=EventOperate.createDelegate(this,this._submit);
    EventOperate.addEvent(this.form,"submit",form_submit);
}

Page.Form.prototype.Add_PreSubmit=function(hander){
    EventOperate.addHandler(this,"PreSubmit",hander);
}

Page.Form.prototype.Remove_PreSubmit=function(hander){
    EventOperate.removeHandler(this,"PreSubmit",hander);
}

Page.Form.prototype._submit=function(sender,e){
    var func=EventOperate.getHandler(this,"PreSubmit");
    if(func) {
        var returnValue=func(this,this.GetData());
        if(returnValue==false) return false;
    }
    return false;
}

//取出某个元素（组）的值
Page.Form.prototype.GetValue=function(itemName){
    var objs=this.form[itemName];
    if(!objs) return "";
    if(objs.length) return this.GetValues(itemName).join(",");
    return objs.value;
}

//是否为空
Page.Form.prototype.IsEmpty=function(itemName){
    var v=this.GetValue(itemName);
    if(v.trim()=="") return true;
    else return false;
}

//匹配正则
Page.Form.prototype.TestExpression=function(itemName,expression){
    var v=this.GetValue(itemName).trim();
    if(v=="") return true;
    var re=new RegExp(expression);
    var matchs=re.exec(v);
    if(matchs==null) return false;
    if(matchs.length<=0) return false;
    if(matchs[0]==v) return true;
    return false;
}

//是否为电话号(中国)
Page.Form.prototype.IsTelephone=function(itemName){
    return this.TestExpression(itemName,/(\(0\d{2,3}\)|0\d{2,3}-?)?\d{7,8}/);
}

//是否为手机号
Page.Form.prototype.IsMobile=function(itemName){
    return this.TestExpression(itemName,/1[35689]\d{9}/);
}

//是否为整数
Page.Form.prototype.IsInt=function(itemName){
    return this.TestExpression(itemName,/\d+/);
}

//是否为数字
Page.Form.prototype.IsNumber=function(itemName){
    return this.TestExpression(itemName,/\d+\.?\d+/);
}

//是否全是中文
Page.Form.prototype.IsChinese=function(itemName){
    return this.TestExpression(itemName,/[\u4e00-\u9fa5]+/);
}

//将数据绑到表单
Page.Form.prototype.Bind=function(data){
    for(var itemName in data){
        var dataItem=data[itemName];
        if(dataItem==null) continue;
        var objs=this.form[itemName];
        if(objs==null) continue;
        if(objs.length){
            for(var i=0;i<objs.length;i++){
                var obj=objs[i];
                var tagName=objs[i].tagName.toUpperCase();
                switch(tagName){
                    case "INPUT":
                        var type=objs[i].type.toUpperCase();
                        if(type=="CHECKBOX"||type=="RADIO"){
                            if(dataItem.constructor==Array){
                                for(var k=0;k<dataItem.length;k++){
                                    if(obj.value==dataItem[k]){
                                        obj.checked=true;
                                        break;
                                    }
                                }
                            }else if(obj.value==dataItem) obj.checked=true;
                        }else{
                            if(dataItem.constructor==Array){
                                obj.value=dataItem[i];
                            }else{
                                obj.value=dataItem;
                            }
                        }
                        break;
                    case "OPTION":
                        var v=obj.value;
                        if(v==null) v=obj.text;
                        if(dataItem.constructor==Array){
                            for(var k=0;k<dataItem.length;k++){
                                if(v==dataItem[k]){
                                    obj.selected=true;
                                    break;
                                }
                            }
                        }else if(v==dataItem) obj.selected=true;
                        break;
                    case "SELECT":
                        var opts=obj.options;
                        for(var j=0;j<opts.length;j++){
                            var opt=opts[j];
                            var v=opt.value;
                            if(v==null) v=opt.text;
                            if(dataItem.constructor==Array){
                                for(var k=0;k<dataItem.length;k++){
                                    if(v==dataItem[k]){
                                        opt.selected=true;
                                        break;
                                    }
                                }
                            }else if(v==dataItem) opt.selected=true;
                        }
                        break;
                    case "TEXTAREA":
                        if(dataItem.constructor==Array){
                            obj.value=dataItem[i];
                        }else{
                            obj.value=dataItem;
                        }
                        break;
                }
            }
        }else{
            var type=objs.type.toUpperCase();
            switch(type){
                case "CHECKBOX":
                case "RADIO":
                    if(dataItem.constructor==Array){
                        for(var k=0;k<dataItem.length;k++){
                            if(objs.value==dataItem[k]){
                                objs.checked=true;
                                break;
                            }
                        }
                    }else if(objs.value==dataItem) obj.checked=true;
                    break;
                default:
                    if(dataItem.constructor==Array&&dataItem.length>0){
                        objs.value=dataItem[0];
                    }else{
                        objs.value=dataItem;
                    }
                    break;
            }
        }
    }
}


Page.Form.prototype.GetData=function(){
    var data={};
    var names=this.GetItemsName();
        for(var i=0;i<names.length;i++){
        var values=this.GetValues(names[i]);
        if(values){
            if(values.length>1) data[names[i]]=values;
            else data[names[i]]=values[0];
        }
    }
    return data;
}

//取出某个元素组的值
Page.Form.prototype.GetValues=function(itemName){
    var list=[];
    var objs=this.form[itemName];
    if(!objs) return list;
    if(objs.length){
        for(var i=0;i<objs.length;i++){
            var obj=objs[i];
            var tagName=objs[i].tagName.toUpperCase();
            switch(tagName){
                case "INPUT":
                    var type=objs[i].type.toUpperCase();
                    if(type=="CHECKBOX"||type=="RADIO"){
                        if(objs[i].checked) list.push(objs[i].value);
                    }else list.push(objs[i].value);
                    break;
                case "OPTION":
                    if(obj.selected){
                        if(obj.value!=null) list.push(obj.value);
                        else list.push(obj.text);
                    }
                    break;
                case "TEXTAREA":
                    list.push(objs[i].value);
                    break;
            }
        }
    }else list.push(objs.value);
    return list;
}

Page.Form.prototype.toString=function(){
    var l=[];
    var names=this.GetItemsName();
    for(var i=0;i<names.length;i++){
        var values=this.GetValues(names[i]);
        for(var j=0;j<values.length;j++){
            l.push(escape(names[i])+"="+escape(values[j]));
        }
    }
    return l.join("&");
}

//取出表单中所有元素的名称
Page.Form.prototype.GetItemsName=function(){
    var l=[];
    var elms=this.form.elements;
    var len=elms.length;
    for(var i=0;i<len;i++){
        var elm=elms[i];
        var name=elm.name;
        if(l.indexOf(name)==-1) l.push(name);
    }
    return l;
}

//取出form的action
Page.Form.prototype.GetAction=function(){
    return this.form.action;
}

//销毁对象
Page.Form.prototype.dispose=function(){
    this.form=null;
}